package grafo;

import Interfaces.Menu;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;


/**
 * 
 * @author Alexandre
 * @author Lucas
 * Classe para abrir um grafo a partir de um arquivo
 */
public class Open {

    public ArrayList<String> entrada;

    public void open() throws FileNotFoundException, IOException {
        Grafo.Vertices.clear();
        entrada = new ArrayList<>();
        
        JFileChooser seletor = new JFileChooser(Grafo.caminho);
        String nomeArquivo;
        int result;

        FileNameExtensionFilter filtro = new FileNameExtensionFilter("Texto", "txt");

        seletor.addChoosableFileFilter(filtro);

        result = seletor.showOpenDialog(null);

        if (result == JFileChooser.CANCEL_OPTION) {
            seletor.cancelSelection();
            return;
        } else {
            nomeArquivo = seletor.getSelectedFile().getPath();
        }
        
        BufferedReader br = new BufferedReader(new FileReader(nomeArquivo));
        
        while (br.ready()) {
            String linha = br.readLine();
            entrada.add(linha);
        }
        montarGrafo();
    }

    /**
     * Monta a grafo a partir dos dados lidos no arquivo
     */
    private void montarGrafo() {
        ArrayList<Integer> grafo = new ArrayList<>();
        String aux;
        for (String entrada1 : entrada) {
            aux = "";
            for (int i = 0; i < entrada1.length(); i++) {
                if (entrada1.charAt(i) == ';') {
                    grafo.add(Integer.parseInt(aux));
                    aux = "";
                } else {
                    aux += entrada1.charAt(i);
                }
            }
        }

        /**
         * Adicionando os vértices
         */
        for (int i = 0; i < grafo.size(); i++) {
            Menu.G.addVertice(grafo.get(i), grafo.get(++i), grafo.get(++i)); //id = posição i, x = posição i+1, y=posição i+2
            ++i; //Pula para o campo da quantidade de arestas
            i += grafo.get(i); //Pula todas as arestas
        }

        /**
         * Adicionando as arestas
         */
        int v;
        int q;
        int i = 0;
        while (i < grafo.size()) {
            v = grafo.get(i); // recebe o id do vertice
            i += 3; //Pula o id, x e y e para na quantidade de vértices
            q = grafo.get(i); // recebe a quantidade de arestas
            ++i; // avança para o primeiro vértice destino
            for (int j = 0; j < q; j++) {
                Menu.G.addAresta(v, grafo.get(i));
                ++i;
            }
        }
    }

}
